package com.jeegod.core.base;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.*;
import com.jeegod.core.util.Dates;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import javax.persistence.Transient;

/**
 * 数据传输基础对象
 * <p>规定每个数据库表都包含的一些字段：</p>
 * <p>versionNumber、createBy、createDate、updateBy、updateDate</p>
 *
 * @author 龚小龙
 * @version 1.0-20181216
 */
public class BaseDTO implements Serializable {

    /**
     * 序列版本ID，用于序列化绑定，反序列化时验证
     */
    private static final long serialVersionUID = 92424068038057227L;

    /**
     * 字段名常量：操作类型
     */
    public static final String FIELD_OPERATE = "operate";

    /**
     * 字段名常量：数据版本号
     */
    public static final String FIELD_OBJECT_VERSION_NUMBER = "versionNumber";

    /**
     * 字段名常量：创建人用户名
     */
    public static final String FIELD_CREATE_BY = "createBy";

    /**
     * 字段名常量：创建日期
     */
    public static final String FIELD_CREATE_DATE = "createDate";

    /**
     * 字段名常量：更新人用户名
     */
    public static final String FIELD_UPDATE_BY = "updateBy";

    /**
     * 字段名常量：更新日期
     */
    public static final String FIELD_UPDATE_DATE = "updateDate";

    /**
     * 操作类型，add/update/delete 参考：{@link com.jeegod.core.constants.Constants.Operation}
     */
    @Transient
    private String _operate;

    /**
     * 数据版本号,每发生update则自增,用于实现乐观锁.
     */
    private Long versionNumber;

    //
    // 下面是标准 WHO 字段
    // ----------------------------------------------------------------------------------------------------
    /**
     * 创建人用户名
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long createBy;
    /**
     * 创建人名称
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Transient
    private String creator;
    /**
     * 创建时间
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = Dates.DEFAULT_PATTERN)
    private Date createDate;

    /**
     * 更新人用户名
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long updateBy;
    /**
     * 更新人名称
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Transient
    private String updater;
    /**
     * 更新时间
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = Dates.DEFAULT_PATTERN)
    private Date updateDate;

    /**
     * 其它属性
     */
    @JsonIgnore
    @Transient
    protected Map<String, Object> innerMap = new HashMap<String, Object>();

    //
    // 下面是扩展属性字段
    // ----------------------------------------------------------------------------------------------------

    /**
     * 扩展字段1
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute1;

    /**
     * 扩展字段2
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute2;

    /**
     * 扩展字段3
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute3;

    /**
     * 扩展字段4
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute4;

    /**
     * 扩展字段5
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute5;

    /**
     * 扩展字段6
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute6;

    /**
     * 扩展字段7
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute7;

    /**
     * 扩展字段8
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute8;

    /**
     * 扩展字段9
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute9;

    /**
     * 扩展字段10
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String attribute10;

    /**
     * 获取：操作类型
     *
     * @return 操作类型
     */
    public String get_operate() {
        return _operate;
    }

    /**
     * 设置：操作类型
     *
     * @param _operate 操作类型
     */
    public void set_operate(String _operate) {
        this._operate = _operate;
    }

    /**
     * 重写Object的toString方法
     *
     * @return 对象的字符串
     */
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    }

    /**
     * 对象转Json格式的字符串
     *
     * @return Json格式字符串
     */
    public String toJSONString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    }

    /**
     * 获取：数据版本号
     *
     * @return 数据版本号
     */
    public Long getVersionNumber() {
        return versionNumber;
    }

    /**
     * 设置：数据版本号
     *
     * @param versionNumber 数据版本号
     */
    public void setVersionNumber(Long versionNumber) {
        this.versionNumber = versionNumber;
    }

    /**
     * 设置：创建人用户名
     *
     * @return 创建人用户名
     */
    public Long getCreateBy() {
        return createBy;
    }

    /**
     * 获取：创建人用户名
     *
     * @param createBy 创建人用户名
     */
    public void setCreateBy(Long createBy) {
        this.createBy = createBy;
    }

    /**
     * 获取：创建人名称
     *
     * @return 创建人名称
     */
    public String getCreator() {
        return creator;
    }

    /**
     * 设置：创建人名称
     *
     * @param creator 创建人名称
     */
    public void setCreator(String creator) {
        this.creator = creator;
    }

    /**
     * 获取：创建日期
     *
     * @return 创建日期
     */
    public Date getCreateDate() {
        return createDate;
    }

    /**
     * 设置：创建日期
     *
     * @param createDate 创建日期
     */
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    /**
     * 获取：更新人用户名
     *
     * @return 更新人用户名
     */
    public Long getUpdateBy() {
        return updateBy;
    }

    /**
     * 设置：更新人用户名
     *
     * @param updateBy 更新人用户名
     */
    public void setUpdateBy(Long updateBy) {
        this.updateBy = updateBy;
    }

    /**
     * 获取：更新人名称
     *
     * @return 更新人名称
     */
    public String getUpdater() {
        return updater;
    }

    /**
     * 设置：更新人名称
     *
     * @param updater 更新人名称
     */
    public void setUpdater(String updater) {
        this.updater = updater;
    }

    /**
     * 获取：更新日期
     *
     * @return 更新日期
     */
    public Date getUpdateDate() {
        return updateDate;
    }

    /**
     * 设置：更新日期
     *
     * @param updateDate 更新日期
     */
    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    /**
     * 获取：从innerMap中key对应的obj对象
     *
     * @param key 主键
     * @return innerMap中key对于的obj对象
     */
    @JsonAnyGetter
    public Object getAttribute(String key) {
        return innerMap.get(key);
    }

    /**
     * 设置：将key-obj键值对加入innerMap
     *
     * @param key 主键
     * @param obj 对象
     */
    @JsonAnySetter
    public void setAttribute(String key, Object obj) {
        innerMap.put(key, obj);
    }

    /**
     * 获取：扩展属性1
     *
     * @return 扩展属性1
     */
    public String getAttribute1() {
        return attribute1;
    }

    /**
     * 设置：扩展属性1
     *
     * @param attribute1 扩展属性1
     */
    public void setAttribute1(String attribute1) {
        this.attribute1 = attribute1;
    }

    /**
     * 获取：扩展属性2
     *
     * @return 扩展属性2
     */
    public String getAttribute2() {
        return attribute2;
    }

    /**
     * 设置：扩展属性2
     *
     * @param attribute2 扩展属性2
     */
    public void setAttribute2(String attribute2) {
        this.attribute2 = attribute2;
    }

    /**
     * 获取：扩展属性3
     *
     * @return 扩展属性3
     */
    public String getAttribute3() {
        return attribute3;
    }

    /**
     * 设置：扩展属性3
     *
     * @param attribute3 扩展属性3
     */
    public void setAttribute3(String attribute3) {
        this.attribute3 = attribute3;
    }

    /**
     * 获取：扩展属性4
     *
     * @return 扩展属性4
     */
    public String getAttribute4() {
        return attribute4;
    }

    /**
     * 设置：扩展属性4
     *
     * @param attribute4 扩展属性4
     */
    public void setAttribute4(String attribute4) {
        this.attribute4 = attribute4;
    }

    /**
     * 获取：扩展属性5
     *
     * @return 扩展属性5
     */
    public String getAttribute5() {
        return attribute5;
    }

    /**
     * 设置：扩展属性5
     *
     * @param attribute5 扩展属性5
     */
    public void setAttribute5(String attribute5) {
        this.attribute5 = attribute5;
    }

    /**
     * 获取：扩展属性6
     *
     * @return 扩展属性6
     */
    public String getAttribute6() {
        return attribute6;
    }

    /**
     * 设置：扩展属性6
     *
     * @param attribute6 扩展属性6
     */
    public void setAttribute6(String attribute6) {
        this.attribute6 = attribute6;
    }

    /**
     * 获取：扩展属性7
     *
     * @return 扩展属性7
     */
    public String getAttribute7() {
        return attribute7;
    }

    /**
     * 设置：扩展属性7
     *
     * @param attribute7 扩展属性7
     */
    public void setAttribute7(String attribute7) {
        this.attribute7 = attribute7;
    }

    /**
     * 获取：扩展属性8
     *
     * @return 扩展属性8
     */
    public String getAttribute8() {
        return attribute8;
    }

    /**
     * 设置：扩展属性8
     *
     * @param attribute8 扩展属性8
     */
    public void setAttribute8(String attribute8) {
        this.attribute8 = attribute8;
    }

    /**
     * 获取：扩展属性9
     *
     * @return 扩展属性9
     */
    public String getAttribute9() {
        return attribute9;
    }

    /**
     * 设置：扩展属性9
     *
     * @param attribute9 扩展属性9
     */
    public void setAttribute9(String attribute9) {
        this.attribute9 = attribute9;
    }

    /**
     * 获取：扩展属性10
     *
     * @return 扩展属性10
     */
    public String getAttribute10() {
        return attribute10;
    }

    /**
     * 设置：扩展属性10
     *
     * @param attribute10 扩展属性10
     */
    public void setAttribute10(String attribute10) {
        this.attribute10 = attribute10;
    }
}
